library(shiny)
Warning: package ‘shiny’ was built under R version 4.1.2
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages -------------------------------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5     v purrr   0.3.4
v tibble  3.1.5     v dplyr   1.0.7
v tidyr   1.1.4     v stringr 1.4.0
v readr   2.0.2     v forcats 0.5.1
-- Conflicts ----------------------------------------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(shinythemes)
Warning: package ‘shinythemes’ was built under R version 4.1.2
library(stringi)
library(RColorBrewer)
seabirds_cleaned_data <- read_csv("clean_data/seabirds_cleaned_data.csv")
Rows: 49020 Columns: 52
-- Column specification -------------------------------------------------------------------------------------------------------------------------------------------------------------
Delimiter: ","
chr  (19): common_name, scientific_name, species_abbreviation, age, plphase, feeding, on_water, on_ice, on_ship, in_hand, fly_by, group_sighting, ship_wake, molting, nat_feeding...
dbl  (28): record_x, record_id, wanplum, total_sighting, num_feeding, num_on_water, num_on_ice, num_fly_by, num_group_sighting, num_ship_wake, record_y, lat, long, ship_activity...
lgl   (3): sex, air_temp, salinity
dttm  (2): date, time

i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.

birds_21 <- seabirds_cleaned_data %>%
  mutate(bird_type = case_when(
  str_detect(common_name, 
             regex("shearwater", 
                   ignore_case = TRUE)) ~ "Shearwater",
  str_detect(common_name, 
             regex("albatross", 
                   ignore_case = TRUE)) ~ "Albatross",
  str_detect(common_name, 
             regex("mollymawk", 
                   ignore_case = TRUE)) ~ "Mollymawk",
  str_detect(common_name, 
             regex("petrel", 
                   ignore_case = TRUE)) ~ "Petrel",
  str_detect(common_name, 
             regex("prion", 
                   ignore_case = TRUE)) ~ "Prion",
  str_detect(common_name, 
             regex("skua", 
                   ignore_case = TRUE)) ~ "Skua",
  str_detect(common_name, 
             regex("penguin", 
                   ignore_case = TRUE)) ~ "Penguin",
  str_detect(common_name, 
             regex("tropicbird", 
                   ignore_case = TRUE)) ~ "Tropicbird",
  str_detect(common_name, 
             regex("noddy", 
                   ignore_case = TRUE)) ~ "Noddy",
  str_detect(common_name, 
             regex("tern", 
                   ignore_case = TRUE)) ~ "Tern",
  str_detect(common_name, 
             regex("gull", 
                   ignore_case = TRUE)) ~ "Gull",
  str_detect(common_name, 
             regex("booby", 
                   ignore_case = TRUE)) ~ "Booby",
  str_detect(common_name, 
             regex("frigatebird", 
                   ignore_case = TRUE)) ~ "Frigatebird",
  str_detect(common_name, 
             regex("shag", 
                   ignore_case = TRUE)) ~ "Shag",
  str_detect(common_name, 
             regex("sheathbill", 
                   ignore_case = TRUE)) ~ "Sheathbill",
  str_detect(common_name, 
             regex("fulmar", 
                   ignore_case = TRUE)) ~ "Fulmar",
  str_detect(common_name, 
             regex("gannet", 
                   ignore_case = TRUE)) ~ "Gannet",
  str_detect(common_name, 
             regex("cormorant", 
                   ignore_case = TRUE)) ~ "Cormorant",
  str_detect(common_name, 
             regex("procellaria", 
                   ignore_case = TRUE)) ~ "Procellaria",
    TRUE ~ common_name))

birds_21
birds_21 %>% 
  arrange(date)
# https://r-charts.com/color-palette-generator/

# https://www.statology.org/color-by-factor-ggplot2/

birds_pal <- c("#50e2ea", "#4edae5", "#4bd2df", "#49cada", "#47c2d4", 
               "#45bbcf", "#42b3c9", "#40abc4", "#3ea3be", "#3b9bb9",
               "#3993b3", "#378bae", "#3483a8", "#327ba3", "#30739d", 
               "#2e6c98", "#2b6492", "#295c8d", "#275487", "#244c82", "#22447c")

names(birds_pal) <- levels(birds_21$bird_type)

custom_colors <- scale_colour_manual(values = birds_pal)
  

birds <- c("Tropicbird" = "#50e2ea", "Tern" = "#4edae5", "Skua" = "#4bd2df", 
           "Sheathbill" = "#49cada", "Shearwater" = "#47c2d4", 
           "Shag" = "#45bbcf", "Seabird" = "#42b3c9", "Procellaria" = "#40abc4",
           "Prion" = "#3ea3be", "Petrel" = "#3b9bb9", "Penguin" = "#3993b3", 
           "Noddy" = "#378bae", "Mollymawk" = "#3483a8", "Jaeger" = "#327ba3", 
           "Gull" = "#30739d", "Gannet" = "#2e6c98", "Fulmar" = "#2b6492", 
           "Frigatebird" = "#295c8d", "Cormorant" = "#275487", 
           "Booby" = "#244c82", "Albatross" = "#22447c")

Jaeger Seabird

```r
birds_9 %>% 
  filter(!is.na(bird_type)) %>% 
  count(bird_type)  
NA

<!-- rnb-source-end -->

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInNwZWNfdGJsX2RmIiwidGJsX2RmIiwidGJsIiwiZGF0YS5mcmFtZSJdLCJucm93IjoyMSwibmNvbCI6Miwic3VtbWFyeSI6eyJBIHRpYmJsZSI6IjIxIHggMiJ9fSwicmRmIjoiSDRzSUFBQUFBQUFBQmwxU3pXcmJRQkFlSzFLQ0ZCSUNKYVNIM251eUlXbExUeTBrS1E0VVVrU2RRbTVsSkcxdDRmV3VHYTF3Zld1ZklPZGVldXQ3OUgzNkRuRm5sUjFqSkJqTnpEZi9PL1A1dy8ycjdENERnRDJJQndQWVMxaUUvZXY4L09MTkJVQWNzVGFBR0ZMUHY3UFhNeFk4ZU1KMEdnenBwUzdRa1cyYUFDUlgxaFpyc1Y1YldsaEM0d0p3T0taNmlrNFZOVlVCMmgrM2VvRWsyZzBhbzhROXZtbTFGc3RIVkZNbGZ1bXQxWHE5d05WYzZuNnlWU1YxRDNKbHBtMXRKRFJYanBRa1NuS3FyWmdPYzdLbDBocXBSZ21lS056cEw1N01jQnJrYkRKVFNDc2VnSFlSTnl2cWJaL3haTjVLcXZoT2tWVEs3c2d1NjdMTERIRFV2U0c4dTJSKzV1ZnhiVEw5WWZiQTZudVdYd0FjM3pKL3lUUUdlTXZ2bnY0S08vRDBCZUQ1VHo4RHEzOTVQNzlaSHZZV2x4aGNxQ1lzTFpMSDgwMThkZXVsa3ZXYVhsaEtkaldTVU45cjlJTi9tODNtWHo5L3FiR1IvQUptRlRvY2ZTT09aKzJ4RjNKZ2w0NFh3RUdSdjZpa0Z6eWdIbkRTR3Q5Sk5TeG5yWmtQWDUvN0NwMzk2VHNLOHVtT0hEM1ZqRFloVnlLWHdIZFJHeGs3MFZoc3orS1lSKzRtSGkycDNoNXN4bWd6Y3RhaCtHV2wxWUowdzhIamYxVlhNRXBLQXdBQSJ9 -->

<div data-pagedtable="false">
  <script data-pagedtable-source type="application/json">
{"columns":[{"label":["bird_type"],"name":[1],"type":["chr"],"align":["left"]},{"label":["n"],"name":[2],"type":["int"],"align":["right"]}],"data":[{"1":"Albatross","2":"15681"},{"1":"Booby","2":"23"},{"1":"Cormorant","2":"9"},{"1":"Frigatebird","2":"6"},{"1":"Fulmar","2":"165"},{"1":"Gannet","2":"1679"},{"1":"Gull","2":"2366"},{"1":"Jaeger","2":"28"},{"1":"Mollymawk","2":"3661"},{"1":"Noddy","2":"39"},{"1":"Penguin","2":"70"},{"1":"Petrel","2":"14096"},{"1":"Prion","2":"2457"},{"1":"Procellaria","2":"2"},{"1":"Seabird","2":"2"},{"1":"Shag","2":"85"},{"1":"Shearwater","2":"6273"},{"1":"Sheathbill","2":"11"},{"1":"Skua","2":"704"},{"1":"Tern","2":"926"},{"1":"Tropicbird","2":"45"}],"options":{"columns":{"min":{},"max":[10],"total":[2]},"rows":{"min":[10],"max":[10],"total":[21]},"pages":{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuc2lnaHRpbmcgPC0gIGJpcmRzXzIxICU+JSBcbiAgICAgICAgICAgIGZpbHRlcighaXMubmEoYmlyZF90eXBlKSkgJT4lIFxuICAgICAgICAgICAgZ3JvdXBfYnkoYmlyZF90eXBlKSAlPiUgXG4gICAgICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBzdW0odG90YWxfc2lnaHRpbmcsIG5hLnJtID0gVFJVRSkpICU+JVxuICAgICAgICAgICAgbXV0YXRlKHNpZ2h0aW5nX2lkID0gcm93X251bWJlcigpKVxuXG5zaWdodGluZyAlPiUgXG4gICAgZ2dwbG90KCkgK1xuICAgIGFlcyh5ID0gYmlyZF90eXBlLCBcbiAgICAgICAgeCA9IGNvdW50LCBmaWxsID0gYmlyZF90eXBlKSArXG4gICAgZ2VvbV9jb2woY29sb3VyID0gXFxibGFja1xcKSArXG4gICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpICtcbiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxLCA1LCAxMCwgMTAwMCwgNjAwMCwgMTQwMDAwMCksXG4gICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSwxNDAwMDAwKSwgXG4gICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gXFxsb2cxMFxcKSArXG4gICAgbGFicyh5ID0gXFxcXG4gQmlyZCBOYW1lc1xcLFxuICAgICAgICAgeCA9IFxcTnVtYmVyIG9mIEJpcmRzIFNlZW4gXFxuIExvZzEwIHNjYWxlXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiaXJkcylcbmBgYFxuYGBgIn0= -->

```r
```r
sighting <-  birds_21 %>% 
            filter(!is.na(bird_type)) %>% 
            group_by(bird_type) %>% 
            summarise(count = sum(total_sighting, na.rm = TRUE)) %>%
            mutate(sighting_id = row_number())

sighting %>% 
    ggplot() +
    aes(y = bird_type, 
        x = count, fill = bird_type) +
    geom_col(colour = \black\) +
    theme(legend.position = \none\) +
    scale_x_continuous(breaks = c(1, 5, 10, 1000, 6000, 1400000),
                       limits = c(1,1400000), 
                       trans = \log10\) +
    labs(y = \\n Bird Names\,
         x = \Number of Birds Seen \n Log10 scale\) +
    scale_fill_manual(values = birds)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuXG4jIGxvZzEwKCkgYXMgMSBvciBtb3JlIGJpcmRzIGFyZSBsZXNzIHRoYW4gMTAgYW5kIGRvbid0IHNob3cgb24gbm9ybWFsIGdyYXBoXG5gYGBcbmBgYCJ9 -->

```r
```r

# log10() as 1 or more birds are less than 10 and don't show on normal graph

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

1,394,468


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZmVlZGluZyA8LSAgYmlyZHNfMjEgJT4lIFxuICAgICAgICAgICAgICBncm91cF9ieShiaXJkX3R5cGUpICU+JSBcbiAgICAgICAgICAgICAgZmlsdGVyKHN0cl9kZXRlY3QoZmVlZGluZywgXFxZRVNcXCkpICU+JSBcbiAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgXG4gICAgICAgICAgICAgIG11dGF0ZShmZWVkaW5nX2lkID0gcm93X251bWJlcigpKVxuXG5mZWVkaW5nICU+JSBcbiAgICBnZ3Bsb3QoKSArXG4gICAgYWVzKHkgPSBiaXJkX3R5cGUsIFxuICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBiaXJkX3R5cGUpICtcbiAgICBnZW9tX2NvbChjb2xvdXIgPSBcXGJsYWNrXFwpICtcbiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcXG5vbmVcXCkgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDEsIDUsIDEwLCAxMDAsIDMwMCwgODAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLDgwMCksIFxuICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IFxcbG9nMTBcXCkgK1xuICAgIGxhYnMoeSA9IFxcXFxuIEJpcmQgTmFtZXNcXCxcbiAgICAgICAgIHggPSBcXE51bWJlciBvZiBCaXJkcyBTZWVuIEZlZWRpbmcgXFxuIExvZzEwIHNjYWxlXFwpICtcbiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiaXJkcylcbmBgYFxuYGBgIn0= -->

```r
```r
feeding <-  birds_21 %>% 
              group_by(bird_type) %>% 
              filter(str_detect(feeding, \YES\)) %>% 
              summarise(count = n()) %>% 
              mutate(feeding_id = row_number())

feeding %>% 
    ggplot() +
    aes(y = bird_type, 
        x = count, fill = bird_type) +
    geom_col(colour = \black\) +
    theme(legend.position = \none\) +
    scale_x_continuous(breaks = c(1, 5, 10, 100, 300, 800),
                       limits = c(1,800), 
                       trans = \log10\) +
    labs(y = \\n Bird Names\,
         x = \Number of Birds Seen Feeding \n Log10 scale\) +
    scale_fill_manual(values = birds)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuIyBsb2cxMCgpIGFzIDEgb3IgbW9yZSBiaXJkcyBhcmUgbGVzcyB0aGFuIDEwIGFuZCBkb24ndCBzaG93IG9uIG5vcm1hbCBncmFwaFxuYGBgXG5gYGAifQ== -->

```r
```r
# log10() as 1 or more birds are less than 10 and don't show on normal graph

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxub25fc2hpcCA8LSAgYmlyZHNfMjEgJT4lIFxuICAgICAgICAgICAgICBncm91cF9ieShiaXJkX3R5cGUpICU+JSBcbiAgICAgICAgICAgICAgZmlsdGVyKHN0cl9kZXRlY3Qob25fc2hpcCwgXCJZRVNcIikpICU+JSBcbiAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgXG4gICAgICAgICAgICAgIG11dGF0ZShvbl9zaGlwX2lkID0gcm93X251bWJlcigpKVxuXG5vbl9zaGlwICU+JSBcbiAgICBnZ3Bsb3QoKSArXG4gICAgYWVzKHkgPSBiaXJkX3R5cGUsIFxuICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBiaXJkX3R5cGUpICtcbiAgICBnZW9tX2NvbChjb2xvdXIgPSBcImJsYWNrXCIpICtcbiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBcIm5vbmVcIikgK1xuICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDEsIDIsIDMsIDUsIDcsIDEwLCA2MCksXG4gICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSw2MCksIFxuICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IFwibG9nMTBcIikgK1xuICAgIGxhYnMoeSA9IFwiXFxuIEJpcmQgTmFtZXNcIixcbiAgICAgICAgIHggPSBcIk51bWJlciBvZiBCaXJkcyBTZWVuIE9uIFNoaXBcIikgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzKVxuYGBgIn0= -->

```r
on_ship <-  birds_21 %>% 
              group_by(bird_type) %>% 
              filter(str_detect(on_ship, "YES")) %>% 
              summarise(count = n()) %>% 
              mutate(on_ship_id = row_number())

on_ship %>% 
    ggplot() +
    aes(y = bird_type, 
        x = count, fill = bird_type) +
    geom_col(colour = "black") +
    theme(legend.position = "none") +
    scale_x_continuous(breaks = c(1, 2, 3, 5, 7, 10, 60),
                       limits = c(1,60), 
                       trans = "log10") +
    labs(y = "\n Bird Names",
         x = "Number of Birds Seen On Ship") +
    scale_fill_manual(values = birds)

```r
in_hand <-  birds_21 %>% 
              group_by(bird_type) %>% 
              filter(str_detect(in_hand, \YES\)) %>% 
              summarise(count = n()) %>% 
              mutate(in_hand_id = row_number()) 

in_hand %>% 
    ggplot() +
    aes(y = bird_type, 
        x = count, fill = bird_type) +
    geom_col(colour = \black\) +
    theme(legend.position = \none\) +
    labs(y = \\n Bird Names\,
         x = \Number of Birds Seen In Hand\) +
    scale_fill_manual(values = birds)

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDI1NTUzMy9wcmV0dHktdGlja3MtZm9yLWxvZy1ub3JtYWwtc2NhbGUtdXNpbmctZ2dwbG90Mi1keW5hbWljLW5vdC1tYW51YWxcbiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDM5NzQ4OTIvZHluYW1pYy1saW1pdHMtYW5kLWJyZWFrcy1pbi1zY2FsZS15LWNvbnRpbnVvdXNcblxuXG5mbHlfYnkgPC0gIGJpcmRzXzIxICU+JSBcbiAgICAgICAgICAgICAgZ3JvdXBfYnkoYmlyZF90eXBlKSAlPiUgXG4gICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KGZseV9ieSwgXCJZRVNcIikpICU+JSBcbiAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgXG4gICAgICAgICAgICAgIG11dGF0ZShmbHlfYnlfaWQgPSByb3dfbnVtYmVyKCkpXG5cblxuIyBiYXNlX2JyZWFrcyA8LSBmdW5jdGlvbihuID0gMTApe1xuIyAgICAgZnVuY3Rpb24oeCkge1xuIyAgICAgICAgIGF4aXNUaWNrcyhsb2cxMChyYW5nZShmbHlfYnkkY291bnQsIG5hLnJtID0gVFJVRSkpLCBcbiMgICAgICAgICAgICAgICAgICAgbG9nID0gaWZfZWxzZShtYXgoZmx5X2J5JGNvdW50KSA+IDEwMDAsIFRSVUUsIEZBTFNFKSwgbiA9IG4pXG4jICAgICB9XG4jIH1cblxuIyBhc2QgPC0gaWZfZWxzZShtYXgoZmx5X2J5JGNvdW50KSA8IDEwMDAsIGMobGltaXRzPWMoMCxtYXgoZmx5X2J5JGNvdW50KSksIFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzICA9IHNlcSgwLG1heChmbHlfYnkkY291bnQpLFxuIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gcm91bmQobWF4KGZseV9ieSRjb3VudCkvNSkpKSwgXG4jICAgICAgICAgICAgICAgIGMobGltaXRzPWMoMCxtYXgoZmx5X2J5JGNvdW50KSksIFxuIyAgICAgICAgICAgICAgICAgIGJyZWFrcyAgPSBzZXEoMCxtYXgoZmx5X2J5JGNvdW50KSwgXG4jICAgICAgICAgICAgICAgICAgIGJ5ID0gcm91bmQobWF4KGZseV9ieSRjb3VudCkvNSkpLFxuIyAgICAgICAgICAgICAgICAgIHRyYW5zID0gXCJsb2cxMFwiKVxuIyAgICAgICAgICAgICAgICApXG5cbmZseV9ieSAlPiUgXG4gICAgZ2dwbG90KCkgK1xuICAgIGFlcyh5ID0gYmlyZF90eXBlLCBcbiAgICAgICAgeCA9IGNvdW50LCBmaWxsID0gYmlyZF90eXBlKSArXG4gICAgZ2VvbV9jb2woY29sb3VyID0gXCJibGFja1wiKSArXG4gICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXCJub25lXCIpICtcbiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzPWMoMCxtYXgoZmx5X2J5JGNvdW50KSksIFxuICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgID0gYyhzZXEoMCxtYXgoZmx5X2J5JGNvdW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gKG1heChmbHlfYnkkY291bnQpLzUpKSksIHRyYW5zID0gXCJsb2cxMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICN2YWxpZGF0ZShtYXgoZmx5X2J5JGNvdW50KSA8IDEwMDAsIHRyYW5zID0gXCJsb2cxMFwiKVxuICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICBsYWJzKHkgPSBcIlxcbiBCaXJkIE5hbWVzXCIsXG4gICAgICAgICB4ID0gXCJOdW1iZXIgb2YgQmlyZHMgU2VlbiBGbHlpbmcgQllcXG4gTG9nMTAgc2NhbGVcIikgK1xuICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzKVxuYGBgIn0= -->

```r
# https://stackoverflow.com/questions/14255533/pretty-ticks-for-log-normal-scale-using-ggplot2-dynamic-not-manual
# https://stackoverflow.com/questions/43974892/dynamic-limits-and-breaks-in-scale-y-continuous


fly_by <-  birds_21 %>% 
              group_by(bird_type) %>% 
              filter(str_detect(fly_by, "YES")) %>% 
              summarise(count = n()) %>% 
              mutate(fly_by_id = row_number())


# base_breaks <- function(n = 10){
#     function(x) {
#         axisTicks(log10(range(fly_by$count, na.rm = TRUE)), 
#                   log = if_else(max(fly_by$count) > 1000, TRUE, FALSE), n = n)
#     }
# }

# asd <- if_else(max(fly_by$count) < 1000, c(limits=c(0,max(fly_by$count)), 
#                                            breaks  = seq(0,max(fly_by$count),
#                                             by = round(max(fly_by$count)/5))), 
#                c(limits=c(0,max(fly_by$count)), 
#                  breaks  = seq(0,max(fly_by$count), 
#                   by = round(max(fly_by$count)/5)),
#                  trans = "log10")
#                )

fly_by %>% 
    ggplot() +
    aes(y = bird_type, 
        x = count, fill = bird_type) +
    geom_col(colour = "black") +
    theme(legend.position = "none") +
    scale_x_continuous(limits=c(0,max(fly_by$count)), 
                       breaks  = c(seq(0,max(fly_by$count),
                        by = (max(fly_by$count)/5))), trans = "log10"
                       #validate(max(fly_by$count) < 1000, trans = "log10")
                       ) +
    labs(y = "\n Bird Names",
         x = "Number of Birds Seen Flying BY\n Log10 scale") +
    scale_fill_manual(values = birds)
Error in seq.default(a, b, length.out = n + 1) : 
  'from' must be a finite number

breaks = c(1, 5, 10, 1000, 6000), limits = c(1,6000), trans = “log10”

variants <- birds_21 %>% 
              filter(bird_type == "Albatross") %>% 
              group_by(common_name) %>% 
              summarise(count = n())
  
variants %>% 
    ggplot() +
    aes(y = common_name, 
        x = count, fill = common_name) +
    geom_col(colour = "black") +
    theme(legend.position = "none") +
    scale_x_continuous(
                       trans = "log10") +
    labs(y = "\n Bird Names",
         x = "Number of Birds Seen Flying BY\n Log10 scale") +
    scale_fill_manual(values = birds_pal)            

```r
variants <- birds_21 %>% 
              filter(bird_type == \Booby\) %>% 
              group_by(common_name) %>% 
              summarise(count = n())
  
variants %>% 
    ggplot() +
    aes(y = common_name, 
        x = count, fill = common_name) +
    geom_col(colour = \black\) +
    theme(legend.position = \none\) +
    scale_x_continuous( 
                       trans = \log10\) +
    labs(y = \\n Bird Names\,
         x = \Number of Birds Seen Flying BY\n Log10 scale\) +
    scale_fill_manual(values = birds_pal)  

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudmFyaWFudHMgPC0gYmlyZHNfMjEgJT4lIFxuICAgICAgICAgICAgICBmaWx0ZXIoYmlyZF90eXBlID09IFxcQ29ybW9yYW50XFwpICU+JSBcbiAgICAgICAgICAgICAgZ3JvdXBfYnkoY29tbW9uX25hbWUpICU+JSBcbiAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKVxuICBcbnZhcmlhbnRzICU+JSBcbiAgICBnZ3Bsb3QoKSArXG4gICAgYWVzKHkgPSBjb21tb25fbmFtZSwgXG4gICAgICAgIHggPSBjb3VudCwgZmlsbCA9IGNvbW1vbl9uYW1lKSArXG4gICAgZ2VvbV9jb2woY29sb3VyID0gXFxibGFja1xcKSArXG4gICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gXFxub25lXFwpICtcbiAgICBzY2FsZV94X2NvbnRpbnVvdXMoIFxuICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9IFxcbG9nMTBcXCkgK1xuICAgIGxhYnMoeSA9IFxcXFxuIEJpcmQgTmFtZXNcXCxcbiAgICAgICAgIHggPSBcXE51bWJlciBvZiBCaXJkcyBTZWVuIEZseWluZyBCWVxcbiBMb2cxMCBzY2FsZVxcKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYmlyZHNfcGFsKSBcbmBgYFxuYGBgIn0= -->

```r
```r
variants <- birds_21 %>% 
              filter(bird_type == \Cormorant\) %>% 
              group_by(common_name) %>% 
              summarise(count = n())
  
variants %>% 
    ggplot() +
    aes(y = common_name, 
        x = count, fill = common_name) +
    geom_col(colour = \black\) +
    theme(legend.position = \none\) +
    scale_x_continuous( 
                       trans = \log10\) +
    labs(y = \\n Bird Names\,
         x = \Number of Birds Seen Flying BY\n Log10 scale\) +
    scale_fill_manual(values = birds_pal) 

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudmFyaWFudHMgPC0gYmlyZHNfMjEgJT4lIFxuICAgICAgICAgICAgICBmaWx0ZXIoYmlyZF90eXBlID09IFxcVHJvcGljYmlyZFxcKSAlPiUgXG4gICAgICAgICAgICAgIGdyb3VwX2J5KGNvbW1vbl9uYW1lKSAlPiUgXG4gICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSlcbiAgXG52YXJpYW50cyAlPiUgXG4gICAgZ2dwbG90KCkgK1xuICAgIGFlcyh5ID0gY29tbW9uX25hbWUsIFxuICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBjb21tb25fbmFtZSkgK1xuICAgIGdlb21fY29sKGNvbG91ciA9IFxcYmxhY2tcXCkgK1xuICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IFxcbm9uZVxcKSArXG4gICAgc2NhbGVfeF9jb250aW51b3VzKCkgK1xuICAgIGxhYnMoeSA9IFxcXFxuIEJpcmQgTmFtZXNcXCxcbiAgICAgICAgIHggPSBcXE51bWJlciBvZiBCaXJkcyBTZWVuIEZseWluZyBCWVxcbiBMb2cxMCBzY2FsZVxcKSArXG4gICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYmlyZHNfcGFsKSBcbmBgYFxuYGBgIn0= -->

```r
```r
variants <- birds_21 %>% 
              filter(bird_type == \Tropicbird\) %>% 
              group_by(common_name) %>% 
              summarise(count = n())
  
variants %>% 
    ggplot() +
    aes(y = common_name, 
        x = count, fill = common_name) +
    geom_col(colour = \black\) +
    theme(legend.position = \none\) +
    scale_x_continuous() +
    labs(y = \\n Bird Names\,
         x = \Number of Birds Seen Flying BY\n Log10 scale\) +
    scale_fill_manual(values = birds_pal) 

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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" />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->










<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuYGBgclxubGlicmFyeShzaGlueSlcbmxpYnJhcnkodGlkeXZlcnNlKVxubGlicmFyeShzaGlueXRoZW1lcylcblxuXG5zZWFiaXJkc19jbGVhbmVkX2RhdGEgPC0gcmVhZF9jc3YoXFxkYXRhL3NlYWJpcmRzX2NsZWFuZWRfZGF0YS5jc3ZcXClcbmBgYFxuYGBgXG5gYGAifQ== -->

```r
```r
```r
library(shiny)
library(tidyverse)
library(shinythemes)


seabirds_cleaned_data <- read_csv(\data/seabirds_cleaned_data.csv\)
Warning: package ‘leaflet’ was built under R version 4.1.2
# birds_9 <- seabirds_cleaned_data %>% 
#   group_by(common_name) %>% 
#   mutate(common_name = if_else(str_detect(common_name, 
#                                           "(?i)shearwater"),"Shearwater", 
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)albatross"), "Albatross",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)mollymawk"), "Mollymawk",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)petrel"), "Petrel",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)prion"), "Prion",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)skua"), "Skua",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)penguin"), "Penguin",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)Red-tailed tropicbird"), 
#                                "Red-tailed tropicbird",
#                                common_name),
#          common_name = if_else(str_detect(common_name, 
#                                           "(?i)Brown noddy"), "Brown noddy",
#                                common_name)
#   ) %>% 
#   filter(common_name %in% c("Shearwater", "Albatross", 
#                             "Mollymawk", "Petrel", 
#                             "Prion", "Skua", 
#                             "Penguin", "Brown noddy", 
#                             "Red-tailed tropicbird"))
# pal <- c("Shearwater" = "grey", "Albatross" = "blue", 
#          "Mollymawk" = "yellow", "Petrel" = "green", 
#          "Prion" = "pink", "Skua" = "purple", 
#          "Penguin" = "orange", "Brown noddy" = "brown", 
#          "Red-tailed tropicbird" = "red")
# names(birds_9)
# head(birds_9)

# birds_9 %>% 
#   group_by(common_name) %>% 
#   mutate(feeding = if_else(feeding %in% "YES", 1, 0),
#          on_ship = if_else(on_ship %in% "YES", 1, 0),
#          in_hand = if_else(in_hand %in% "YES", 1, 0),
#          fly_by = if_else(fly_by %in% "YES", 1, 0)) %>% 
#   summarise(sighting_count = sum(total_sighting, na.rm = TRUE),
#             feeding_count = sum(feeding, na.rm = TRUE),
#             on_ship_count = sum(on_ship, na.rm = TRUE),
#             in_hand_count = sum(in_hand, na.rm = TRUE),
#             fly_by_count = sum(fly_by, na.rm = TRUE)) 
```r
tail(position)

<!-- rnb-source-end -->

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInRibF9kZiIsInRibCIsImRhdGEuZnJhbWUiXSwibnJvdyI6NiwibmNvbCI6Mywic3VtbWFyeSI6eyJBIHRpYmJsZSI6IjYgeCAzIn19LCJyZGYiOiJINHNJQUFBQUFBQUFCbDFSUFVqRFFCaTlORWxMZ3kwRjkwNnVEZGdpT0VsS1JjbGsvYVhySlkyMUdPOUtla1hwMU1WQkVKZmlySXZvN0dMSDBPTHFMQzdPeFZVWGhjYTdTdzdhQ3h6ZisxN2U5NyszMmFnWURRTUFvQUpOVVlDcVV3alN0ZnBxZWEwTWdKYWluZ0kwa0dYMmdxcVd1UlNvZVNhcmpxK3dSVUYxZkxNMDRQYWhHREk3ZVRsS2JNVDV5ZWlKNmFTRU91bGo1RkZRbUNQVnc0T2FySE45Mk8wbXVsUkNadW83KzNiREpZbWI1aTZoYUVZZjd5NnM4WklnckVyV2ZpMk9kcjh1dysxUCsvdk8vZ20zOHNQcHhuQXE0aXg0ejNXVzg3NW8zVDdKUFZvZmx2TzNrcmw5ZTdhYzZ6aWgxQzJDWjU3b1ZrMUlyUW1KSnliMG9laGE4ekZxU2ZIWkFKK2JJa2VPVGN4V0dFWFJieXhVSTJsakJzME56ZU9BaHNUakw2VEw0QTVwWTBTVHBkanRkQ2xZQ1NTaTBFT3NlTFBrbnZUUWFhbXl6aXJ3Ly9HWFMzQjZEcXR4VFUxMHBvdWplS2pWUm1KdTNZZU81eWRPbms3Smh6UTdRUnVKZlJpVTdab0VFeWgwaG90OXdjUzNuZjBEZDdmbUQ3UUNBQUE9In0= -->

<div data-pagedtable="false">
  <script data-pagedtable-source type="application/json">
{"columns":[{"label":["date"],"name":[1],"type":["S3: POSIXct"],"align":["right"]},{"label":["lat"],"name":[2],"type":["dbl"],"align":["right"]},{"label":["long"],"name":[3],"type":["dbl"],"align":["right"]}],"data":[{"1":"1989-09-17","2":"-38.00000","3":"141.0000"},{"1":"1989-09-24","2":"-34.00000","3":"150.7500"},{"1":"1989-10-29","2":"-34.00000","3":"150.7500"},{"1":"1990-12-19","2":"-51.54000","3":"155.8267"},{"1":"1990-12-20","2":"-47.74444","3":"151.8481"},{"1":"1990-12-21","2":"-44.11389","3":"148.3750"}],"options":{"columns":{"min":{},"max":[10],"total":[3]},"rows":{"min":[10],"max":[10],"total":[6]},"pages":{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG4gIGxlYWZsZXQoZGF0YSA9IGJpcmRzXzIxKSAlPiVcbiAgYWRkVGlsZXMoKSAlPiUgICMgQWRkIGRlZmF1bHQgT3BlblN0cmVldE1hcCBtYXAgdGlsZXNcbiAgYWRkTWFya2VycyhsYWJlbCA9IGJpcmRzXzIxJGNvbW1vbl9uYW1lLCBjbHVzdGVyT3B0aW9ucyA9IG1hcmtlckNsdXN0ZXJPcHRpb25zKCkpIFxuYGBgIn0= -->

```r

  leaflet(data = birds_21) %>%
  addTiles() %>%  # Add default OpenStreetMap map tiles
  addMarkers(label = birds_21$common_name, clusterOptions = markerClusterOptions()) 
Assuming "long" and "lat" are longitude and latitude, respectively
Warning in validateCoords(lng, lat, funcName) :
  Data contains 30 rows with either missing or invalid lat/lon values and will be ignored
  
 # Print the map

-45.91667 165.4000

seabirds_cleaned_data
ship_data <- read_excel(here("raw_data/seabirds.xls"), 
                             sheet = "Ship data by record ID") %>% 
              clean_names()

position <- ship_data %>% 
  select(date, lat, long) %>%
  filter(!is.na(lat),
         !is.na(long)) %>% 
  group_by(date) %>% 
  summarise_if(is.numeric, mean)

position
ship_data %>% 
  select(date, lat, long) %>%
  filter(is.na(date))
```r
library(dplyr)
library(shiny)
library(leaflet)
library(readxl)
library(RColorBrewer)
library(maps)
library(leaflet.extras)
library(htmlwidgets)



data_dots = read_csv(\test4.csv\)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiUm93czogOCBDb2x1bW5zOiAxNFxuLS0gQ29sdW1uIHNwZWNpZmljYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuRGVsaW1pdGVyOiBcXFxuIn0= -->

Rows: 8 Columns: 14 – Column specification ————————————————————————————————————————————————————- Delimiter:




<!-- rnb-output-end -->

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxudWkgPC0gYm9vdHN0cmFwUGFnZShcbiAgdGFncyRzdHlsZSh0eXBlID0gXFx0ZXh0L2Nzc1xcLCBcXGh0bWxcbmBgYCJ9 -->

```r
```r
ui <- bootstrapPage(
  tags$style(type = \text/css\, \html
Warning: Couldn't coerce the `end` argument to a date string with format yyyy-mm-dd
```r
server <- function(input, output) {

  #n <- 60
  qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual', ]
  col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))


  myMap = leaflet(\map\) %>% 
    addTiles(group = \Base\) %>%
    addProviderTiles(providers$CartoDB.Positron, group = \Grey\) %>%
    addResetMapButton()


  rv <- reactiveValues(
    filteredData =data_dots,
    ids = unique(data_dots$Route)
  )

  observeEvent(input$dateRange, 
               {rv$filteredData = data_dots[as.Date(data_dots$ship_date) >= input$dateRange[1] & as.Date(data_dots$ship_date) <= input$dateRange[2],]

               rv$ids = unique(rv$filteredData$Route)
               }

  )



  # Initiate the map
  output$map <- renderLeaflet({

    for (i in rv$ids) {
      #print(i)
      myMap = myMap %>%
        addPolylines(
          data = subset(rv$filteredData, Route == i),
          weight = 3,
          color = sample(col_vector, 1),
          opacity = 0.8,
          smoothFactor = 1,
          lng = ~Dlong, 
          lat = ~Dlat,
          highlight = highlightOptions(
            weight = 5,
            color = \blue\,
            bringToFront = TRUE
          ),
          label = ~ as.character(ShipmentID),
          popup = ~ as.character(ShipmentID),
          group = \test\
        )

    }
    myMap


  })


}
shinyApp(ui = ui, server = server)

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoiXG5MaXN0ZW5pbmcgb24gaHR0cDovLzEyNy4wLjAuMTo0Mjc3XG5XYXJuaW5nOiBFcnJvciBpbiBjaGFyVG9EYXRlOiBjaGFyYWN0ZXIgc3RyaW5nIGlzIG5vdCBpbiBhIHN0YW5kYXJkIHVuYW1iaWd1b3VzIGZvcm1hdFxuICBbTm8gc3RhY2sgdHJhY2UgYXZhaWxhYmxlXVxuTkFcbiJ9 -->

Listening on http://127.0.0.1:4277 Warning: Error in charToDate: character string is not in a standard unambiguous format [No stack trace available] NA




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxuZGF0YV9kb3RzICU+JSBcbiAgbXV0YXRlKHNoaXBfZGF0ZSA9IGFzLkRhdGUoc2hpcF9kYXRlLCBcXCV5LyVtLyVkXFwpLFxuICAgICAgICAgZGVsaXZlcnlfZGF0ZSA9IGFzLkRhdGUoZGVsaXZlcnlfZGF0ZSwgXFwleS8lbS8lZFxcKSlcbmBgYFxuYGBgIn0= -->

```r
```r
data_dots %>% 
  mutate(ship_date = as.Date(ship_date, \%y/%m/%d\),
         delivery_date = as.Date(delivery_date, \%y/%m/%d\))

<!-- rnb-source-end -->

<!-- rnb-frame-begin eyJtZXRhZGF0YSI6eyJjbGFzc2VzIjpbInNwZWNfdGJsX2RmIiwidGJsX2RmIiwidGJsIiwiZGF0YS5mcmFtZSJdLCJucm93Ijo4LCJuY29sIjoxNCwic3VtbWFyeSI6eyJBIHRpYmJsZSI6IjggeCAxNCJ9fSwicmRmIjoiSDRzSUFBQUFBQUFBQnJWVlM0L1NVQlMrdEhTbVZDRWsvZ0dXSmdZeUxSM0hXZGtDbXFnNG5RQUxGZ2JzUUoxcDdMVFlGblJNZk96VWxmRWZHRmN1WEJvVGQ0MExkYUVyLzhpc0JsZUQ5N1k5bEpaQkVxSTN1VDNQKzUzSGJVOGJ0WGFaYTNNSUlScWxVeWxFTTVoRmE5VmRYdGdVRUVwVFdFcWhOTW9RK2doN1hjQk1EdTg4M214b29QbmlSc1R5RVN0RWJEbGlSV0NGNkpnUUhSUHdNVVNUR095elk1TE4rcnRWYWFJQXBtZW9qaE1tRDhwMFRYVTFURS8vYlZCcXNqaE9ySG5zOVRyUGI0bGRjWUdjSWZLVnpTNi9NYXU0dkIwcEZpR1VsOHJ4VE5aa1k2UTdWaWlkYThvN0xibFFyY3NOT1ZUbHJzbk5WbUZYcmlzRnVkNVNRaTJISFF0VnVWRlhtbWNDTFlVRmgrREZZcVV4LzVaMFVocUxJV1g4emtvbjQ3dUJEUGFrWHlBRGp0ZDVPdnIrY2J2dGRaNThlWDNuNG9uWGVTbS8ycnIxemV1OHdlVHIrOGllOUF2a2FUNlZUeTh1VWVkdlNwVVBQL0Q2S1ZVK3QvTjd0MzlKRmM4UEZ0bVRmb0VNT0ZlUGcrU1dVUW1kVFFFSGhEbi8wQ0xsVVd3bC9kRGZidjEvU25QM3V4cEZjL2U3R2tWejk3c2FUUTRaVXozVVlNams0T1Bmd1VyNGZwMERmZER0azJrUUtMSjl6ZEJIbW4wMHErU2EyT3RRTTkwYk5RQ3U5WFQzYURwTkh1dURxY0d3elAycHdWQmRNRFNzNFJTUWJtb1A0RUlVVzkvWFRUaWh6RUFwczFBS2dZcFhsN0d0aHlXb01JczM5UncvSnBQSjd3VmpqOE0xcWFWN05xbmZIMzR4dUhWcjRPcVdpY0VvOG1OaEVvZFRka0tSSDVva2VML1lPeGlhOTR0bGtVVHc3Y0hLaGp3N3crZUNtRFJreGtBWE5CTTNBZHJER09xZVpzQ2d3MVg2UlpZR3RtNUNPem1zZFVxdTVhcmd4L1VzQXpUQlpELzlBekdsamI5UkJ3QUEifQ== -->

<div data-pagedtable="false">
  <script data-pagedtable-source type="application/json">
{"columns":[{"label":["Name"],"name":[1],"type":["chr"],"align":["left"]},{"label":["ship_date"],"name":[2],"type":["date"],"align":["right"]},{"label":["delivery_date"],"name":[3],"type":["date"],"align":["right"]},{"label":["ShipmentID"],"name":[4],"type":["chr"],"align":["left"]},{"label":["Dcity"],"name":[5],"type":["chr"],"align":["left"]},{"label":["Dzip"],"name":[6],"type":["dbl"],"align":["right"]},{"label":["Dlong"],"name":[7],"type":["dbl"],"align":["right"]},{"label":["Dlat"],"name":[8],"type":["dbl"],"align":["right"]},{"label":["Route"],"name":[9],"type":["dbl"],"align":["right"]},{"label":["Seq"],"name":[10],"type":["dbl"],"align":["right"]},{"label":["Origin"],"name":[11],"type":["chr"],"align":["left"]},{"label":["Ozip"],"name":[12],"type":["dbl"],"align":["right"]},{"label":["Olong"],"name":[13],"type":["dbl"],"align":["right"]},{"label":["Olat"],"name":[14],"type":["dbl"],"align":["right"]}],"data":[{"1":"1-0","2":"<NA>","3":"<NA>","4":"FL1174_4","5":"Alviso","6":"95002","7":"-121.976","8":"37.426","9":"1","10":"0","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"1-1","2":"<NA>","3":"<NA>","4":"FL1174_4","5":"SANTA CLARA","6":"95050","7":"-121.965","8":"37.350","9":"1","10":"1","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"1-2","2":"<NA>","3":"<NA>","4":"FL1185_10","5":"EAST PALO ALTO","6":"94303","7":"-122.129","8":"37.448","9":"1","10":"2","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"1-3","2":"<NA>","3":"<NA>","4":"FL1169_10","5":"SAN CARLOS","6":"94070","7":"-122.274","8":"37.500","9":"1","10":"3","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"1-4","2":"<NA>","3":"<NA>","4":"FL1174_4","5":"Alviso","6":"95002","7":"-121.976","8":"37.426","9":"1","10":"4","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"2-0","2":"<NA>","3":"<NA>","4":"FL1174_3","5":"Alviso","6":"95002","7":"-121.976","8":"37.426","9":"2","10":"0","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"2-1","2":"<NA>","3":"<NA>","4":"FL1174_3","5":"SANTA CLARA","6":"95050","7":"-121.965","8":"37.350","9":"2","10":"1","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"},{"1":"2-2","2":"<NA>","3":"<NA>","4":"FL1174_3","5":"Alviso","6":"95002","7":"-121.976","8":"37.426","9":"2","10":"2","11":"Alviso","12":"95002","13":"-121.976","14":"37.426"}],"options":{"columns":{"min":{},"max":[10],"total":[14]},"rows":{"min":[10],"max":[10],"total":[8]},"pages":{}}}
  </script>
</div>

<!-- rnb-frame-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


# https://kateto.net/network-visualization
# https://stackoverflow.com/questions/38432788/how-do-i-visualise-multiple-routes-using-leaflet-in-r



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2xlYWZsZXQvbWFya2Vycy5odG1sXG4jIGZpcnN0IDIwIHF1YWtlc1xuZGYuMjAgPC0gcXVha2VzWzE6MjAsXVxuXG5nZXRDb2xvciA8LSBmdW5jdGlvbihxdWFrZXMpIHtcbiAgc2FwcGx5KHBvc2l0aW9uJGRhdGUsIGZ1bmN0aW9uKGRhdGUpIHtcbiAgaWYoZGF0ZSA8PSAxOTc5LTEyLTMxKSB7XG4gICAgXCJncmVlblwiXG4gIH0gZWxzZSBpZihkYXRlIDw9IDE5ODktMTItMzEpIHtcbiAgICBcIm9yYW5nZVwiXG4gIH0gZWxzZSB7XG4gICAgXCJyZWRcIlxuICB9IH0pXG59XG5cbmljb25zIDwtIGF3ZXNvbWVJY29ucyhcbiAgaWNvbiA9ICdpb3MtY2xvc2UnLFxuICBpY29uQ29sb3IgPSAnYmxhY2snLFxuICBsaWJyYXJ5ID0gJ2lvbicsXG4gIG1hcmtlckNvbG9yID0gZ2V0Q29sb3IocG9zaXRpb24pXG4pXG5cbmxlYWZsZXQocG9zaXRpb24pICU+JSBhZGRUaWxlcygpICU+JVxuICBhZGRBd2Vzb21lTWFya2Vycyh+bG9uZywgfmxhdCwgaWNvbj1pY29ucywgbGFiZWw9fmFzLmNoYXJhY3RlcihkYXRlKSlcbmBgYCJ9 -->

```r
# https://rstudio.github.io/leaflet/markers.html
# first 20 quakes
df.20 <- quakes[1:20,]

getColor <- function(quakes) {
  sapply(position$date, function(date) {
  if(date <= 1979-12-31) {
    "green"
  } else if(date <= 1989-12-31) {
    "orange"
  } else {
    "red"
  } })
}

icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = getColor(position)
)

leaflet(position) %>% addTiles() %>%
  addAwesomeMarkers(~long, ~lat, icon=icons, label=~as.character(date))
getColor <- function(quakes) {
  sapply(position$date, function(date) {
  if(date %in% "^196") {
    "green"
  } else if(date  %in% "^197") {
    "orange"
  } else if(date  %in% "^198") {
    "blue"
  } else {
    "red"
  } })
}

icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = getColor(position)
)

leaflet(position) %>% addTiles() %>%
  addAwesomeMarkers(~long, ~lat, icon=icons, label=~as.character(date))
getColor <- function(quakes) {
  sapply(position$date, function(date) {
  case_when(str_detect(date, 
             regex("^196", 
                   ignore_case = TRUE)) ~ "green",
            str_detect(date, 
             regex("^197", 
                   ignore_case = TRUE)) ~ "orange",
             str_detect(date, 
             regex("^198", 
                   ignore_case = TRUE)) ~ "blue",
             str_detect(date, 
             regex("^199", 
                   ignore_case = TRUE)) ~ "red"
    
  ) })
}

icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = getColor(position)
)

leaflet(position) %>% addTiles() %>%
  addAwesomeMarkers(~long, ~lat, icon=icons, label=~as.character(date))
# https://stackoverflow.com/questions/56362519/how-to-filter-date-range-for-routes-in-r-leaflet-shiny-app

library(dplyr)
library(shiny)
library(leaflet)
library(readxl)
library(RColorBrewer)
library(maps)
library(leaflet.extras)
library(htmlwidgets)



data_dots = read_csv("test4.csv")


ui <- bootstrapPage(
  tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
  leafletOutput("map", width = "100%", height = "100%"),
  absolutePanel(top = 10, right = 10,

                dateRangeInput("dateRange", "Date Range Input", start =  min(data_dots$ship_date), end = max(data_dots$ship_date))


  )
)


server <- function(input, output) {

  #n <- 60
  qual_col_pals = brewer.pal.info[brewer.pal.info$category == 'qual', ]
  col_vector = unlist(mapply(brewer.pal, qual_col_pals$maxcolors, rownames(qual_col_pals)))


  myMap = leaflet("map") %>% 
    addTiles(group = "Base") %>%
    addProviderTiles(providers$CartoDB.Positron, group = "Grey") %>%
    addResetMapButton()


  rv <- reactiveValues(
    filteredData =data_dots,
    ids = unique(data_dots$Route)
  )

  observeEvent(input$dateRange, 
               {rv$filteredData = data_dots[as.Date(data_dots$ship_date) >= input$dateRange[1] & as.Date(data_dots$ship_date) <= input$dateRange[2],]

               rv$ids = unique(rv$filteredData$Route)
               }

  )



  # Initiate the map
  output$map <- renderLeaflet({

    for (i in rv$ids) {
      #print(i)
      myMap = myMap %>%
        addPolylines(
          data = subset(rv$filteredData, Route == i),
          weight = 3,
          color = sample(col_vector, 1),
          opacity = 0.8,
          smoothFactor = 1,
          lng = ~Dlong, 
          lat = ~Dlat,
          highlight = highlightOptions(
            weight = 5,
            color = "blue",
            bringToFront = TRUE
          ),
          label = ~ as.character(ShipmentID),
          popup = ~ as.character(ShipmentID),
          group = "test"
        )

    }
    myMap


  })


}
shinyApp(ui = ui, server = server)
data_dots %>% 
  mutate(ship_date = as.Date(ship_date, "%y/%m/%d"),
         delivery_date = as.Date(delivery_date, "%y/%m/%d"))
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkoc2hpbnkpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2hpbnl0aGVtZXMpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmBgYA0KDQpgYGB7cn0NCnNlYWJpcmRzX2NsZWFuZWRfZGF0YSA8LSByZWFkX2NzdigiY2xlYW5fZGF0YS9zZWFiaXJkc19jbGVhbmVkX2RhdGEuY3N2IikNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCg0KYmlyZHNfMjEgPC0gc2VhYmlyZHNfY2xlYW5lZF9kYXRhICU+JQ0KICBtdXRhdGUoYmlyZF90eXBlID0gY2FzZV93aGVuKA0KICBzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICByZWdleCgic2hlYXJ3YXRlciIsIA0KICAgICAgICAgICAgICAgICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIlNoZWFyd2F0ZXIiLA0KICBzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICByZWdleCgiYWxiYXRyb3NzIiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiQWxiYXRyb3NzIiwNCiAgc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQogICAgICAgICAgICAgcmVnZXgoIm1vbGx5bWF3ayIsIA0KICAgICAgICAgICAgICAgICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIk1vbGx5bWF3ayIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJwZXRyZWwiLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJQZXRyZWwiLA0KICBzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICByZWdleCgicHJpb24iLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJQcmlvbiIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJza3VhIiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiU2t1YSIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJwZW5ndWluIiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiUGVuZ3VpbiIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJ0cm9waWNiaXJkIiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiVHJvcGljYmlyZCIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJub2RkeSIsIA0KICAgICAgICAgICAgICAgICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIk5vZGR5IiwNCiAgc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQogICAgICAgICAgICAgcmVnZXgoInRlcm4iLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJUZXJuIiwNCiAgc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQogICAgICAgICAgICAgcmVnZXgoImd1bGwiLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJHdWxsIiwNCiAgc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQogICAgICAgICAgICAgcmVnZXgoImJvb2J5IiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiQm9vYnkiLA0KICBzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICByZWdleCgiZnJpZ2F0ZWJpcmQiLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJGcmlnYXRlYmlyZCIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJzaGFnIiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiU2hhZyIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJzaGVhdGhiaWxsIiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiU2hlYXRoYmlsbCIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJmdWxtYXIiLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJGdWxtYXIiLA0KICBzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiAgICAgICAgICAgICByZWdleCgiZ2FubmV0IiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiR2FubmV0IiwNCiAgc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQogICAgICAgICAgICAgcmVnZXgoImNvcm1vcmFudCIsIA0KICAgICAgICAgICAgICAgICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIkNvcm1vcmFudCIsDQogIHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJwcm9jZWxsYXJpYSIsIA0KICAgICAgICAgICAgICAgICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gIlByb2NlbGxhcmlhIiwNCiAgICBUUlVFIH4gY29tbW9uX25hbWUpKQ0KDQpiaXJkc18yMQ0KYGBgDQoNCmBgYHtyfQ0KYmlyZHNfMjEgJT4lIA0KICBhcnJhbmdlKGRhdGUpDQpgYGANCg0KDQoNCg0KYGBge3J9DQojIGh0dHBzOi8vci1jaGFydHMuY29tL2NvbG9yLXBhbGV0dGUtZ2VuZXJhdG9yLw0KDQojIGh0dHBzOi8vd3d3LnN0YXRvbG9neS5vcmcvY29sb3ItYnktZmFjdG9yLWdncGxvdDIvDQoNCmJpcmRzX3BhbCA8LSBjKCIjNTBlMmVhIiwgIiM0ZWRhZTUiLCAiIzRiZDJkZiIsICIjNDljYWRhIiwgIiM0N2MyZDQiLCANCiAgICAgICAgICAgICAgICIjNDViYmNmIiwgIiM0MmIzYzkiLCAiIzQwYWJjNCIsICIjM2VhM2JlIiwgIiMzYjliYjkiLA0KICAgICAgICAgICAgICAgIiMzOTkzYjMiLCAiIzM3OGJhZSIsICIjMzQ4M2E4IiwgIiMzMjdiYTMiLCAiIzMwNzM5ZCIsIA0KICAgICAgICAgICAgICAgIiMyZTZjOTgiLCAiIzJiNjQ5MiIsICIjMjk1YzhkIiwgIiMyNzU0ODciLCAiIzI0NGM4MiIsICIjMjI0NDdjIikNCg0KbmFtZXMoYmlyZHNfcGFsKSA8LSBsZXZlbHMoYmlyZHNfMjEkYmlyZF90eXBlKQ0KDQpjdXN0b21fY29sb3JzIDwtIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYmlyZHNfcGFsKQ0KICANCg0KYmlyZHMgPC0gYygiVHJvcGljYmlyZCIgPSAiIzUwZTJlYSIsICJUZXJuIiA9ICIjNGVkYWU1IiwgIlNrdWEiID0gIiM0YmQyZGYiLCANCiAgICAgICAgICAgIlNoZWF0aGJpbGwiID0gIiM0OWNhZGEiLCAiU2hlYXJ3YXRlciIgPSAiIzQ3YzJkNCIsIA0KICAgICAgICAgICAiU2hhZyIgPSAiIzQ1YmJjZiIsICJTZWFiaXJkIiA9ICIjNDJiM2M5IiwgIlByb2NlbGxhcmlhIiA9ICIjNDBhYmM0IiwNCiAgICAgICAgICAgIlByaW9uIiA9ICIjM2VhM2JlIiwgIlBldHJlbCIgPSAiIzNiOWJiOSIsICJQZW5ndWluIiA9ICIjMzk5M2IzIiwgDQogICAgICAgICAgICJOb2RkeSIgPSAiIzM3OGJhZSIsICJNb2xseW1hd2siID0gIiMzNDgzYTgiLCAiSmFlZ2VyIiA9ICIjMzI3YmEzIiwgDQogICAgICAgICAgICJHdWxsIiA9ICIjMzA3MzlkIiwgIkdhbm5ldCIgPSAiIzJlNmM5OCIsICJGdWxtYXIiID0gIiMyYjY0OTIiLCANCiAgICAgICAgICAgIkZyaWdhdGViaXJkIiA9ICIjMjk1YzhkIiwgIkNvcm1vcmFudCIgPSAiIzI3NTQ4NyIsIA0KICAgICAgICAgICAiQm9vYnkiID0gIiMyNDRjODIiLCAiQWxiYXRyb3NzIiA9ICIjMjI0NDdjIikNCg0KDQpgYGANCg0KSmFlZ2VyDQpTZWFiaXJkDQpgYGB7cn0NCmJpcmRzXzIxICU+JSANCiAgZmlsdGVyKCFpcy5uYShiaXJkX3R5cGUpKSAlPiUgDQogIGNvdW50KGJpcmRfdHlwZSkgIA0KICANCmBgYA0KDQoNCmBgYHtyfQ0Kc2lnaHRpbmcgPC0gIGJpcmRzXzIxICU+JSANCiAgICAgICAgICAgIGZpbHRlcighaXMubmEoYmlyZF90eXBlKSkgJT4lIA0KICAgICAgICAgICAgZ3JvdXBfYnkoYmlyZF90eXBlKSAlPiUgDQogICAgICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBzdW0odG90YWxfc2lnaHRpbmcsIG5hLnJtID0gVFJVRSkpICU+JQ0KICAgICAgICAgICAgbXV0YXRlKHNpZ2h0aW5nX2lkID0gcm93X251bWJlcigpKQ0KDQpzaWdodGluZyAlPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh5ID0gYmlyZF90eXBlLCANCiAgICAgICAgeCA9IGNvdW50LCBmaWxsID0gYmlyZF90eXBlKSArDQogICAgZ2VvbV9jb2woY29sb3VyID0gImJsYWNrIikgKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICAgIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBjKDEsIDUsIDEwLCAxMDAwLCA2MDAwLCAxNDAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygxLDE0MDAwMDApLCANCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSArDQogICAgbGFicyh5ID0gIlxuIEJpcmQgTmFtZXMiLA0KICAgICAgICAgeCA9ICJOdW1iZXIgb2YgQmlyZHMgU2VlbiBcbiBMb2cxMCBzY2FsZSIpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiaXJkcykNCg0KIyBsb2cxMCgpIGFzIDEgb3IgbW9yZSBiaXJkcyBhcmUgbGVzcyB0aGFuIDEwIGFuZCBkb24ndCBzaG93IG9uIG5vcm1hbCBncmFwaA0KYGBgDQoxLDM5NCw0NjgNCg0KYGBge3J9DQpmZWVkaW5nIDwtICBiaXJkc18yMSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGJpcmRfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChmZWVkaW5nLCAiWUVTIikpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShmZWVkaW5nX2lkID0gcm93X251bWJlcigpKQ0KDQpmZWVkaW5nICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgYWVzKHkgPSBiaXJkX3R5cGUsIA0KICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBiaXJkX3R5cGUpICsNCiAgICBnZW9tX2NvbChjb2xvdXIgPSAiYmxhY2siKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMSwgNSwgMTAsIDEwMCwgMzAwLCA4MDApLA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsODAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIikgKw0KICAgIGxhYnMoeSA9ICJcbiBCaXJkIE5hbWVzIiwNCiAgICAgICAgIHggPSAiTnVtYmVyIG9mIEJpcmRzIFNlZW4gRmVlZGluZyBcbiBMb2cxMCBzY2FsZSIpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiaXJkcykNCiMgbG9nMTAoKSBhcyAxIG9yIG1vcmUgYmlyZHMgYXJlIGxlc3MgdGhhbiAxMCBhbmQgZG9uJ3Qgc2hvdyBvbiBub3JtYWwgZ3JhcGgNCmBgYA0KDQpgYGB7cn0NCm9uX3NoaXAgPC0gIGJpcmRzXzIxICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYmlyZF90eXBlKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KG9uX3NoaXAsICJZRVMiKSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSANCiAgICAgICAgICAgICAgbXV0YXRlKG9uX3NoaXBfaWQgPSByb3dfbnVtYmVyKCkpDQoNCm9uX3NoaXAgJT4lIA0KICAgIGdncGxvdCgpICsNCiAgICBhZXMoeSA9IGJpcmRfdHlwZSwgDQogICAgICAgIHggPSBjb3VudCwgZmlsbCA9IGJpcmRfdHlwZSkgKw0KICAgIGdlb21fY29sKGNvbG91ciA9ICJibGFjayIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygxLCAyLCAzLCA1LCA3LCAxMCwgNjApLA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDEsNjApLCANCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nMTAiKSArDQogICAgbGFicyh5ID0gIlxuIEJpcmQgTmFtZXMiLA0KICAgICAgICAgeCA9ICJOdW1iZXIgb2YgQmlyZHMgU2VlbiBPbiBTaGlwIikgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzKQ0KYGBgDQoNCg0KYGBge3J9DQppbl9oYW5kIDwtICBiaXJkc18yMSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGJpcmRfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChpbl9oYW5kLCAiWUVTIikpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGNvdW50ID0gbigpKSAlPiUgDQogICAgICAgICAgICAgIG11dGF0ZShpbl9oYW5kX2lkID0gcm93X251bWJlcigpKSANCg0KaW5faGFuZCAlPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh5ID0gYmlyZF90eXBlLCANCiAgICAgICAgeCA9IGNvdW50LCBmaWxsID0gYmlyZF90eXBlKSArDQogICAgZ2VvbV9jb2woY29sb3VyID0gImJsYWNrIikgKw0KICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICAgIGxhYnMoeSA9ICJcbiBCaXJkIE5hbWVzIiwNCiAgICAgICAgIHggPSAiTnVtYmVyIG9mIEJpcmRzIFNlZW4gSW4gSGFuZCIpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiaXJkcykNCmBgYA0KDQoNCmBgYHtyfQ0KIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNDI1NTUzMy9wcmV0dHktdGlja3MtZm9yLWxvZy1ub3JtYWwtc2NhbGUtdXNpbmctZ2dwbG90Mi1keW5hbWljLW5vdC1tYW51YWwNCiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDM5NzQ4OTIvZHluYW1pYy1saW1pdHMtYW5kLWJyZWFrcy1pbi1zY2FsZS15LWNvbnRpbnVvdXMNCg0KDQpmbHlfYnkgPC0gIGJpcmRzXzIxICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkoYmlyZF90eXBlKSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KGZseV9ieSwgIllFUyIpKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoZmx5X2J5X2lkID0gcm93X251bWJlcigpKQ0KDQoNCiMgYmFzZV9icmVha3MgPC0gZnVuY3Rpb24obiA9IDEwKXsNCiMgICAgIGZ1bmN0aW9uKHgpIHsNCiMgICAgICAgICBheGlzVGlja3MobG9nMTAocmFuZ2UoZmx5X2J5JGNvdW50LCBuYS5ybSA9IFRSVUUpKSwgDQojICAgICAgICAgICAgICAgICAgIGxvZyA9IGlmX2Vsc2UobWF4KGZseV9ieSRjb3VudCkgPiAxMDAwLCBUUlVFLCBGQUxTRSksIG4gPSBuKQ0KIyAgICAgfQ0KIyB9DQoNCiMgYXNkIDwtIGlmX2Vsc2UobWF4KGZseV9ieSRjb3VudCkgPCAxMDAwLCBjKGxpbWl0cz1jKDAsbWF4KGZseV9ieSRjb3VudCkpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyAgPSBzZXEoMCxtYXgoZmx5X2J5JGNvdW50KSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSA9IHJvdW5kKG1heChmbHlfYnkkY291bnQpLzUpKSksIA0KIyAgICAgICAgICAgICAgICBjKGxpbWl0cz1jKDAsbWF4KGZseV9ieSRjb3VudCkpLCANCiMgICAgICAgICAgICAgICAgICBicmVha3MgID0gc2VxKDAsbWF4KGZseV9ieSRjb3VudCksIA0KIyAgICAgICAgICAgICAgICAgICBieSA9IHJvdW5kKG1heChmbHlfYnkkY291bnQpLzUpKSwNCiMgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpDQojICAgICAgICAgICAgICAgICkNCg0KZmx5X2J5ICU+JSANCiAgICBnZ3Bsb3QoKSArDQogICAgYWVzKHkgPSBiaXJkX3R5cGUsIA0KICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBiaXJkX3R5cGUpICsNCiAgICBnZW9tX2NvbChjb2xvdXIgPSAiYmxhY2siKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDAsbWF4KGZseV9ieSRjb3VudCkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzICA9IGMoc2VxKDAsbWF4KGZseV9ieSRjb3VudCksDQogICAgICAgICAgICAgICAgICAgICAgICBieSA9IChtYXgoZmx5X2J5JGNvdW50KS81KSkpLCB0cmFucyA9ICJsb2cxMCINCiAgICAgICAgICAgICAgICAgICAgICAgI3ZhbGlkYXRlKG1heChmbHlfYnkkY291bnQpIDwgMTAwMCwgdHJhbnMgPSAibG9nMTAiKQ0KICAgICAgICAgICAgICAgICAgICAgICApICsNCiAgICBsYWJzKHkgPSAiXG4gQmlyZCBOYW1lcyIsDQogICAgICAgICB4ID0gIk51bWJlciBvZiBCaXJkcyBTZWVuIEZseWluZyBCWVxuIExvZzEwIHNjYWxlIikgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzKQ0KIyBsb2cxMCgpIGFzIDEgb3IgbW9yZSBiaXJkcyBhcmUgbGVzcyB0aGFuIDEwIGFuZCBkb24ndCBzaG93IG9uIG5vcm1hbCBncmFwaA0KYGBgDQpicmVha3MgPSBjKDEsIDUsIDEwLCAxMDAwLCA2MDAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoMSw2MDAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zID0gImxvZzEwIg0KDQpgYGB7cn0NCnZhcmlhbnRzIDwtIGJpcmRzXzIxICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGJpcmRfdHlwZSA9PSAiQWxiYXRyb3NzIikgJT4lIA0KICAgICAgICAgICAgICBncm91cF9ieShjb21tb25fbmFtZSkgJT4lIA0KICAgICAgICAgICAgICBzdW1tYXJpc2UoY291bnQgPSBuKCkpDQogIA0KdmFyaWFudHMgJT4lIA0KICAgIGdncGxvdCgpICsNCiAgICBhZXMoeSA9IGNvbW1vbl9uYW1lLCANCiAgICAgICAgeCA9IGNvdW50LCBmaWxsID0gY29tbW9uX25hbWUpICsNCiAgICBnZW9tX2NvbChjb2xvdXIgPSAiYmxhY2siKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogICAgc2NhbGVfeF9jb250aW51b3VzKA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpICsNCiAgICBsYWJzKHkgPSAiXG4gQmlyZCBOYW1lcyIsDQogICAgICAgICB4ID0gIk51bWJlciBvZiBCaXJkcyBTZWVuIEZseWluZyBCWVxuIExvZzEwIHNjYWxlIikgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzX3BhbCkgICAgICAgICAgICANCmBgYA0KDQpgYGB7cn0NCnZhcmlhbnRzIDwtIGJpcmRzXzIxICU+JSANCiAgICAgICAgICAgICAgZmlsdGVyKGJpcmRfdHlwZSA9PSAiQm9vYnkiKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGNvbW1vbl9uYW1lKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkNCiAgDQp2YXJpYW50cyAlPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh5ID0gY29tbW9uX25hbWUsIA0KICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBjb21tb25fbmFtZSkgKw0KICAgIGdlb21fY29sKGNvbG91ciA9ICJibGFjayIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoIA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpICsNCiAgICBsYWJzKHkgPSAiXG4gQmlyZCBOYW1lcyIsDQogICAgICAgICB4ID0gIk51bWJlciBvZiBCaXJkcyBTZWVuIEZseWluZyBCWVxuIExvZzEwIHNjYWxlIikgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzX3BhbCkgIA0KYGBgDQoNCmBgYHtyfQ0KdmFyaWFudHMgPC0gYmlyZHNfMjEgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoYmlyZF90eXBlID09ICJDb3Jtb3JhbnQiKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGNvbW1vbl9uYW1lKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkNCiAgDQp2YXJpYW50cyAlPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh5ID0gY29tbW9uX25hbWUsIA0KICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBjb21tb25fbmFtZSkgKw0KICAgIGdlb21fY29sKGNvbG91ciA9ICJibGFjayIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoIA0KICAgICAgICAgICAgICAgICAgICAgICB0cmFucyA9ICJsb2cxMCIpICsNCiAgICBsYWJzKHkgPSAiXG4gQmlyZCBOYW1lcyIsDQogICAgICAgICB4ID0gIk51bWJlciBvZiBCaXJkcyBTZWVuIEZseWluZyBCWVxuIExvZzEwIHNjYWxlIikgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJpcmRzX3BhbCkgDQpgYGANCg0KYGBge3J9DQp2YXJpYW50cyA8LSBiaXJkc18yMSAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcihiaXJkX3R5cGUgPT0gIlRyb3BpY2JpcmQiKSAlPiUgDQogICAgICAgICAgICAgIGdyb3VwX2J5KGNvbW1vbl9uYW1lKSAlPiUgDQogICAgICAgICAgICAgIHN1bW1hcmlzZShjb3VudCA9IG4oKSkNCiAgDQp2YXJpYW50cyAlPiUgDQogICAgZ2dwbG90KCkgKw0KICAgIGFlcyh5ID0gY29tbW9uX25hbWUsIA0KICAgICAgICB4ID0gY291bnQsIGZpbGwgPSBjb21tb25fbmFtZSkgKw0KICAgIGdlb21fY29sKGNvbG91ciA9ICJibGFjayIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoKSArDQogICAgbGFicyh5ID0gIlxuIEJpcmQgTmFtZXMiLA0KICAgICAgICAgeCA9ICJOdW1iZXIgb2YgQmlyZHMgU2VlbiBGbHlpbmcgQllcbiBMb2cxMCBzY2FsZSIpICsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBiaXJkc19wYWwpIA0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNoaW55dGhlbWVzKQ0KDQoNCiNzZWFiaXJkc19jbGVhbmVkX2RhdGEgPC0gcmVhZF9jc3YoImRhdGEvc2VhYmlyZHNfY2xlYW5lZF9kYXRhLmNzdiIpDQpgYGANCg0KYGBge3J9DQojIGJpcmRzXzkgPC0gc2VhYmlyZHNfY2xlYW5lZF9kYXRhICU+JSANCiMgICBncm91cF9ieShjb21tb25fbmFtZSkgJT4lIA0KIyAgIG11dGF0ZShjb21tb25fbmFtZSA9IGlmX2Vsc2Uoc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoP2kpc2hlYXJ3YXRlciIpLCJTaGVhcndhdGVyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25fbmFtZSksDQojICAgICAgICAgIGNvbW1vbl9uYW1lID0gaWZfZWxzZShzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/aSlhbGJhdHJvc3MiKSwgIkFsYmF0cm9zcyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25fbmFtZSksDQojICAgICAgICAgIGNvbW1vbl9uYW1lID0gaWZfZWxzZShzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/aSltb2xseW1hd2siKSwgIk1vbGx5bWF3ayIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25fbmFtZSksDQojICAgICAgICAgIGNvbW1vbl9uYW1lID0gaWZfZWxzZShzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/aSlwZXRyZWwiKSwgIlBldHJlbCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25fbmFtZSksDQojICAgICAgICAgIGNvbW1vbl9uYW1lID0gaWZfZWxzZShzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/aSlwcmlvbiIpLCAiUHJpb24iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uX25hbWUpLA0KIyAgICAgICAgICBjb21tb25fbmFtZSA9IGlmX2Vsc2Uoc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoP2kpc2t1YSIpLCAiU2t1YSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25fbmFtZSksDQojICAgICAgICAgIGNvbW1vbl9uYW1lID0gaWZfZWxzZShzdHJfZGV0ZWN0KGNvbW1vbl9uYW1lLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig/aSlwZW5ndWluIiksICJQZW5ndWluIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbl9uYW1lKSwNCiMgICAgICAgICAgY29tbW9uX25hbWUgPSBpZl9lbHNlKHN0cl9kZXRlY3QoY29tbW9uX25hbWUsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKD9pKVJlZC10YWlsZWQgdHJvcGljYmlyZCIpLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWQtdGFpbGVkIHRyb3BpY2JpcmQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbW9uX25hbWUpLA0KIyAgICAgICAgICBjb21tb25fbmFtZSA9IGlmX2Vsc2Uoc3RyX2RldGVjdChjb21tb25fbmFtZSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoP2kpQnJvd24gbm9kZHkiKSwgIkJyb3duIG5vZGR5IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbl9uYW1lKQ0KIyAgICkgJT4lIA0KIyAgIGZpbHRlcihjb21tb25fbmFtZSAlaW4lIGMoIlNoZWFyd2F0ZXIiLCAiQWxiYXRyb3NzIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9sbHltYXdrIiwgIlBldHJlbCIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByaW9uIiwgIlNrdWEiLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZW5ndWluIiwgIkJyb3duIG5vZGR5IiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVkLXRhaWxlZCB0cm9waWNiaXJkIikpDQpgYGANCg0KDQpgYGB7cn0NCiMgcGFsIDwtIGMoIlNoZWFyd2F0ZXIiID0gImdyZXkiLCAiQWxiYXRyb3NzIiA9ICJibHVlIiwgDQojICAgICAgICAgICJNb2xseW1hd2siID0gInllbGxvdyIsICJQZXRyZWwiID0gImdyZWVuIiwgDQojICAgICAgICAgICJQcmlvbiIgPSAicGluayIsICJTa3VhIiA9ICJwdXJwbGUiLCANCiMgICAgICAgICAgIlBlbmd1aW4iID0gIm9yYW5nZSIsICJCcm93biBub2RkeSIgPSAiYnJvd24iLCANCiMgICAgICAgICAgIlJlZC10YWlsZWQgdHJvcGljYmlyZCIgPSAicmVkIikNCmBgYA0KDQpgYGB7cn0NCiMgbmFtZXMoYmlyZHNfOSkNCiMgaGVhZChiaXJkc185KQ0KYGBgDQoNCg0KYGBge3J9DQoNCiMgYmlyZHNfOSAlPiUgDQojICAgZ3JvdXBfYnkoY29tbW9uX25hbWUpICU+JSANCiMgICBtdXRhdGUoZmVlZGluZyA9IGlmX2Vsc2UoZmVlZGluZyAlaW4lICJZRVMiLCAxLCAwKSwNCiMgICAgICAgICAgb25fc2hpcCA9IGlmX2Vsc2Uob25fc2hpcCAlaW4lICJZRVMiLCAxLCAwKSwNCiMgICAgICAgICAgaW5faGFuZCA9IGlmX2Vsc2UoaW5faGFuZCAlaW4lICJZRVMiLCAxLCAwKSwNCiMgICAgICAgICAgZmx5X2J5ID0gaWZfZWxzZShmbHlfYnkgJWluJSAiWUVTIiwgMSwgMCkpICU+JSANCiMgICBzdW1tYXJpc2Uoc2lnaHRpbmdfY291bnQgPSBzdW0odG90YWxfc2lnaHRpbmcsIG5hLnJtID0gVFJVRSksDQojICAgICAgICAgICAgIGZlZWRpbmdfY291bnQgPSBzdW0oZmVlZGluZywgbmEucm0gPSBUUlVFKSwNCiMgICAgICAgICAgICAgb25fc2hpcF9jb3VudCA9IHN1bShvbl9zaGlwLCBuYS5ybSA9IFRSVUUpLA0KIyAgICAgICAgICAgICBpbl9oYW5kX2NvdW50ID0gc3VtKGluX2hhbmQsIG5hLnJtID0gVFJVRSksDQojICAgICAgICAgICAgIGZseV9ieV9jb3VudCA9IHN1bShmbHlfYnksIG5hLnJtID0gVFJVRSkpIA0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGxlYWZsZXQpDQpgYGANCg0KYGBge3J9DQoNCiAgbGVhZmxldChkYXRhID0gYmlyZHNfMjEpICU+JQ0KICBhZGRUaWxlcygpICU+JSAgIyBBZGQgZGVmYXVsdCBPcGVuU3RyZWV0TWFwIG1hcCB0aWxlcw0KICBhZGRNYXJrZXJzKGxhYmVsID0gYmlyZHNfMjEkY29tbW9uX25hbWUsIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSkgDQogIA0KICMgUHJpbnQgdGhlIG1hcA0KYGBgDQoNCg0KLTQ1LjkxNjY3DQoxNjUuNDAwMA0KDQoNCmBgYHtyfQ0Kc2VhYmlyZHNfY2xlYW5lZF9kYXRhDQpgYGANCg0KYGBge3J9DQpzaGlwX2RhdGEgPC0gcmVhZF9leGNlbChoZXJlKCJyYXdfZGF0YS9zZWFiaXJkcy54bHMiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIlNoaXAgZGF0YSBieSByZWNvcmQgSUQiKSAlPiUgDQogICAgICAgICAgICAgIGNsZWFuX25hbWVzKCkNCg0KcG9zaXRpb24gPC0gc2hpcF9kYXRhICU+JSANCiAgc2VsZWN0KGRhdGUsIGxhdCwgbG9uZykgJT4lDQogIGZpbHRlcighaXMubmEobGF0KSwNCiAgICAgICAgICFpcy5uYShsb25nKSkgJT4lIA0KICBncm91cF9ieShkYXRlKSAlPiUgDQogIHN1bW1hcmlzZV9pZihpcy5udW1lcmljLCBtZWFuKQ0KDQpwb3NpdGlvbg0KYGBgDQoNCg0KDQpgYGB7cn0NCnNoaXBfZGF0YSAlPiUgDQogIHNlbGVjdChkYXRlLCBsYXQsIGxvbmcpICU+JQ0KICBmaWx0ZXIoaXMubmEoZGF0ZSkpDQpgYGANCg0KDQoNCmBgYHtyfQ0KdGFpbChwb3NpdGlvbikNCmBgYA0KDQoNCmBgYHtyfQ0KbGVhZmxldChkYXRhID0gcG9zaXRpb24pICU+JQ0KICBhZGRUaWxlcygpICU+JSAgIyBBZGQgZGVmYXVsdCBPcGVuU3RyZWV0TWFwIG1hcCB0aWxlcw0KICBhZGRNYXJrZXJzKGxhYmVsID0gcG9zaXRpb24kZGF0ZSwgY2x1c3Rlck9wdGlvbnMgPSBtYXJrZXJDbHVzdGVyT3B0aW9ucygpKSANCiAgDQogIyBQcmludCB0aGUgbWFwDQpgYGANCg0KIyBodHRwczovL2thdGV0by5uZXQvbmV0d29yay12aXN1YWxpemF0aW9uDQojIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM4NDMyNzg4L2hvdy1kby1pLXZpc3VhbGlzZS1tdWx0aXBsZS1yb3V0ZXMtdXNpbmctbGVhZmxldC1pbi1yDQoNCg0KYGBge3J9DQojIGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vbGVhZmxldC9tYXJrZXJzLmh0bWwNCiMgZmlyc3QgMjAgcXVha2VzDQpkZi4yMCA8LSBxdWFrZXNbMToyMCxdDQoNCmdldENvbG9yIDwtIGZ1bmN0aW9uKHF1YWtlcykgew0KICBzYXBwbHkocG9zaXRpb24kZGF0ZSwgZnVuY3Rpb24oZGF0ZSkgew0KICBpZihkYXRlIDw9IDE5NzktMTItMzEpIHsNCiAgICAiZ3JlZW4iDQogIH0gZWxzZSBpZihkYXRlIDw9IDE5ODktMTItMzEpIHsNCiAgICAib3JhbmdlIg0KICB9IGVsc2Ugew0KICAgICJyZWQiDQogIH0gfSkNCn0NCg0KaWNvbnMgPC0gYXdlc29tZUljb25zKA0KICBpY29uID0gJ2lvcy1jbG9zZScsDQogIGljb25Db2xvciA9ICdibGFjaycsDQogIGxpYnJhcnkgPSAnaW9uJywNCiAgbWFya2VyQ29sb3IgPSBnZXRDb2xvcihwb3NpdGlvbikNCikNCg0KbGVhZmxldChwb3NpdGlvbikgJT4lIGFkZFRpbGVzKCkgJT4lDQogIGFkZEF3ZXNvbWVNYXJrZXJzKH5sb25nLCB+bGF0LCBpY29uPWljb25zLCBsYWJlbD1+YXMuY2hhcmFjdGVyKGRhdGUpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2V0Q29sb3IgPC0gZnVuY3Rpb24ocXVha2VzKSB7DQogIHNhcHBseShwb3NpdGlvbiRkYXRlLCBmdW5jdGlvbihkYXRlKSB7DQogIGlmKGRhdGUgJWluJSAiXjE5NiIpIHsNCiAgICAiZ3JlZW4iDQogIH0gZWxzZSBpZihkYXRlICAlaW4lICJeMTk3Iikgew0KICAgICJvcmFuZ2UiDQogIH0gZWxzZSBpZihkYXRlICAlaW4lICJeMTk4Iikgew0KICAgICJibHVlIg0KICB9IGVsc2Ugew0KICAgICJyZWQiDQogIH0gfSkNCn0NCg0KaWNvbnMgPC0gYXdlc29tZUljb25zKA0KICBpY29uID0gJ2lvcy1jbG9zZScsDQogIGljb25Db2xvciA9ICdibGFjaycsDQogIGxpYnJhcnkgPSAnaW9uJywNCiAgbWFya2VyQ29sb3IgPSBnZXRDb2xvcihwb3NpdGlvbikNCikNCg0KbGVhZmxldChwb3NpdGlvbikgJT4lIGFkZFRpbGVzKCkgJT4lDQogIGFkZEF3ZXNvbWVNYXJrZXJzKH5sb25nLCB+bGF0LCBpY29uPWljb25zLCBsYWJlbD1+YXMuY2hhcmFjdGVyKGRhdGUpKQ0KYGBgDQoNCg0KYGBge3J9DQpnZXRDb2xvciA8LSBmdW5jdGlvbihxdWFrZXMpIHsNCiAgc2FwcGx5KHBvc2l0aW9uJGRhdGUsIGZ1bmN0aW9uKGRhdGUpIHsNCiAgY2FzZV93aGVuKHN0cl9kZXRlY3QoZGF0ZSwgDQogICAgICAgICAgICAgcmVnZXgoIl4xOTYiLCANCiAgICAgICAgICAgICAgICAgICBpZ25vcmVfY2FzZSA9IFRSVUUpKSB+ICJncmVlbiIsDQogICAgICAgICAgICBzdHJfZGV0ZWN0KGRhdGUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJeMTk3IiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAib3JhbmdlIiwNCiAgICAgICAgICAgICBzdHJfZGV0ZWN0KGRhdGUsIA0KICAgICAgICAgICAgIHJlZ2V4KCJeMTk4IiwgDQogICAgICAgICAgICAgICAgICAgaWdub3JlX2Nhc2UgPSBUUlVFKSkgfiAiYmx1ZSIsDQogICAgICAgICAgICAgc3RyX2RldGVjdChkYXRlLCANCiAgICAgICAgICAgICByZWdleCgiXjE5OSIsIA0KICAgICAgICAgICAgICAgICAgIGlnbm9yZV9jYXNlID0gVFJVRSkpIH4gInJlZCINCiAgICANCiAgKSB9KQ0KfQ0KDQppY29ucyA8LSBhd2Vzb21lSWNvbnMoDQogIGljb24gPSAnaW9zLWNsb3NlJywNCiAgaWNvbkNvbG9yID0gJ2JsYWNrJywNCiAgbGlicmFyeSA9ICdpb24nLA0KICBtYXJrZXJDb2xvciA9IGdldENvbG9yKHBvc2l0aW9uKQ0KKQ0KDQpsZWFmbGV0KHBvc2l0aW9uKSAlPiUgYWRkVGlsZXMoKSAlPiUNCiAgYWRkQXdlc29tZU1hcmtlcnMofmxvbmcsIH5sYXQsIGljb249aWNvbnMsIGxhYmVsPX5hcy5jaGFyYWN0ZXIoZGF0ZSkpDQpgYGANCg0KDQoNCg0KDQoNCmBgYHtyfQ0KIyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81NjM2MjUxOS9ob3ctdG8tZmlsdGVyLWRhdGUtcmFuZ2UtZm9yLXJvdXRlcy1pbi1yLWxlYWZsZXQtc2hpbnktYXBwDQoNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkobWFwcykNCmxpYnJhcnkobGVhZmxldC5leHRyYXMpDQpsaWJyYXJ5KGh0bWx3aWRnZXRzKQ0KDQoNCg0KZGF0YV9kb3RzID0gcmVhZF9jc3YoInRlc3Q0LmNzdiIpDQoNCg0KdWkgPC0gYm9vdHN0cmFwUGFnZSgNCiAgdGFncyRzdHlsZSh0eXBlID0gInRleHQvY3NzIiwgImh0bWwsIGJvZHkge3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCV9IiksDQogIGxlYWZsZXRPdXRwdXQoIm1hcCIsIHdpZHRoID0gIjEwMCUiLCBoZWlnaHQgPSAiMTAwJSIpLA0KICBhYnNvbHV0ZVBhbmVsKHRvcCA9IDEwLCByaWdodCA9IDEwLA0KDQoNCiAgICAgICAgICAgICAgICBkYXRlUmFuZ2VJbnB1dCgiZGF0ZVJhbmdlIiwgIkRhdGUgUmFuZ2UgSW5wdXQiLCBzdGFydCA9ICBtaW4oZGF0YV9kb3RzJHNoaXBfZGF0ZSksIGVuZCA9IG1heChkYXRhX2RvdHMkc2hpcF9kYXRlKSkNCg0KDQogICkNCikNCg0KDQpzZXJ2ZXIgPC0gZnVuY3Rpb24oaW5wdXQsIG91dHB1dCkgew0KDQogICNuIDwtIDYwDQogIHF1YWxfY29sX3BhbHMgPSBicmV3ZXIucGFsLmluZm9bYnJld2VyLnBhbC5pbmZvJGNhdGVnb3J5ID09ICdxdWFsJywgXQ0KICBjb2xfdmVjdG9yID0gdW5saXN0KG1hcHBseShicmV3ZXIucGFsLCBxdWFsX2NvbF9wYWxzJG1heGNvbG9ycywgcm93bmFtZXMocXVhbF9jb2xfcGFscykpKQ0KDQoNCiAgbXlNYXAgPSBsZWFmbGV0KCJtYXAiKSAlPiUgDQogICAgYWRkVGlsZXMoZ3JvdXAgPSAiQmFzZSIpICU+JQ0KICAgIGFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJENhcnRvREIuUG9zaXRyb24sIGdyb3VwID0gIkdyZXkiKSAlPiUNCiAgICBhZGRSZXNldE1hcEJ1dHRvbigpDQoNCg0KICBydiA8LSByZWFjdGl2ZVZhbHVlcygNCiAgICBmaWx0ZXJlZERhdGEgPWRhdGFfZG90cywNCiAgICBpZHMgPSB1bmlxdWUoZGF0YV9kb3RzJFJvdXRlKQ0KICApDQoNCiAgb2JzZXJ2ZUV2ZW50KGlucHV0JGRhdGVSYW5nZSwgDQogICAgICAgICAgICAgICB7cnYkZmlsdGVyZWREYXRhID0gZGF0YV9kb3RzW2FzLkRhdGUoZGF0YV9kb3RzJHNoaXBfZGF0ZSkgPj0gaW5wdXQkZGF0ZVJhbmdlWzFdICYgYXMuRGF0ZShkYXRhX2RvdHMkc2hpcF9kYXRlKSA8PSBpbnB1dCRkYXRlUmFuZ2VbMl0sXQ0KDQogICAgICAgICAgICAgICBydiRpZHMgPSB1bmlxdWUocnYkZmlsdGVyZWREYXRhJFJvdXRlKQ0KICAgICAgICAgICAgICAgfQ0KDQogICkNCg0KDQoNCiAgIyBJbml0aWF0ZSB0aGUgbWFwDQogIG91dHB1dCRtYXAgPC0gcmVuZGVyTGVhZmxldCh7DQoNCg0KICAgIGZvciAoaSBpbiBydiRpZHMpIHsNCiAgICAgICNwcmludChpKQ0KICAgICAgbXlNYXAgPSBteU1hcCAlPiUNCiAgICAgICAgYWRkUG9seWxpbmVzKA0KICAgICAgICAgIGRhdGEgPSBzdWJzZXQocnYkZmlsdGVyZWREYXRhLCBSb3V0ZSA9PSBpKSwNCiAgICAgICAgICB3ZWlnaHQgPSAzLA0KICAgICAgICAgIGNvbG9yID0gc2FtcGxlKGNvbF92ZWN0b3IsIDEpLA0KICAgICAgICAgIG9wYWNpdHkgPSAwLjgsDQogICAgICAgICAgc21vb3RoRmFjdG9yID0gMSwNCiAgICAgICAgICBsbmcgPSB+RGxvbmcsIA0KICAgICAgICAgIGxhdCA9IH5EbGF0LA0KICAgICAgICAgIGhpZ2hsaWdodCA9IGhpZ2hsaWdodE9wdGlvbnMoDQogICAgICAgICAgICB3ZWlnaHQgPSA1LA0KICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsDQogICAgICAgICAgICBicmluZ1RvRnJvbnQgPSBUUlVFDQogICAgICAgICAgKSwNCiAgICAgICAgICBsYWJlbCA9IH4gYXMuY2hhcmFjdGVyKFNoaXBtZW50SUQpLA0KICAgICAgICAgIHBvcHVwID0gfiBhcy5jaGFyYWN0ZXIoU2hpcG1lbnRJRCksDQogICAgICAgICAgZ3JvdXAgPSAidGVzdCINCiAgICAgICAgKQ0KDQoNCiAgICB9DQogICAgbXlNYXANCg0KDQogIH0pDQoNCg0KfQ0Kc2hpbnlBcHAodWkgPSB1aSwgc2VydmVyID0gc2VydmVyKQ0KYGBgDQoNCmBgYHtyfQ0KZGF0YV9kb3RzICU+JSANCiAgbXV0YXRlKHNoaXBfZGF0ZSA9IGFzLkRhdGUoc2hpcF9kYXRlLCAiJXkvJW0vJWQiKSwNCiAgICAgICAgIGRlbGl2ZXJ5X2RhdGUgPSBhcy5EYXRlKGRlbGl2ZXJ5X2RhdGUsICIleS8lbS8lZCIpKQ0KYGBgDQoNCg==